#ifndef __MESSAGE_H__
#define __MESSAGE_H__

#include <string>

using std::string;

namespace SOS
{

enum TaskType
{
    TASK_TYPE_LOGIN_SECTION1 = 1,
    TASK_TYPE_LOGIN_SECTION1_RESP_OK,
    TASK_TYPE_LOGIN_SECTION1_RESP_ERROR,
    TASK_TYPE_LOGIN_SECTION2,
    TASK_TYPE_LOGIN_SECTION2_RESP_OK,
    TASK_TYPE_LOGIN_SECTION2_RESP_ERROR,

};

struct TLV
{
    int type;
    int length;
    char data[1024];

#if 0
// 序列化：将 TLV 转为字节流（考虑字节序）
std::vector<char> toBytes() const {
    std::vector<char> bytes;
    // 写入 type（转换为网络字节序）
    int type_net = htonl(type);
    bytes.insert(bytes.end(), (char*)&type_net, (char*)&type_net + 4);
    // 写入 length（转换为网络字节序）
    int len_net = htonl(length);
    bytes.insert(bytes.end(), (char*)&len_net, (char*)&len_net + 4);
    // 写入 data
    bytes.insert(bytes.end(), data, data + length);
    return bytes;
}

// 反序列化：从字节流解析 TLV
bool parseFromBytes(const char* bytes, size_t len) {
    if (len < 8) return false; // 至少需要 type(4) + length(4)
    // 解析 type（网络字节序转主机字节序）
    type = ntohl(*(int*)bytes);
    // 解析 length
    length = ntohl(*(int*)(bytes + 4));
    // 解析 data（检查长度是否合法）
    if (len - 8 < (size_t)length || length > 1024) return false;
    memcpy(data, bytes + 8, length);
    return true;
}
#endif


};

struct Packet
{
    int type;
    int length;
    string msg;

#if 0
std::vector<char> toBytes() const {
       std::vector<char> bytes;
       int type_net = htonl(type);
       bytes.insert(bytes.end(), (char*)&type_net, (char*)&type_net + 4);
       int len_net = htonl(length);
       bytes.insert(bytes.end(), (char*)&len_net, (char*)&len_net + 4);
       // 写入 msg 内容（length 需与 msg.size() 一致）
       bytes.insert(bytes.end(), msg.data(), msg.data() + length);
       return bytes;
   }

   bool parseFromBytes(const char* bytes, size_t len) {
       if (len < 8) return false;
       type = ntohl(*(int*)bytes);
       length = ntohl(*(int*)(bytes + 4));
       if (len - 8 < (size_t)length) return false;
       msg.assign(bytes + 8, length);
       return true;
   }
#endif


};

}//end of namespace SOS

#endif
